#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/point_stamped.hpp>
using namespace std::chrono_literals;
class PointTFBroadcastCppNode : public rclcpp::Node
{
private:
    rclcpp::Publisher<geometry_msgs::msg::PointStamped>::SharedPtr pub_;
    rclcpp::TimerBase::SharedPtr timer_;
    double_t x_;

public:
    PointTFBroadcastCppNode() : Node("point_tf_broadcast_cpp_node"), x_(0.0)
    {
        RCLCPP_INFO(this->get_logger(), "PointTFBroadcastCppNode创建");
        pub_ = this->create_publisher<geometry_msgs::msg::PointStamped>(
            "point", 10);
        timer_ = this->create_wall_timer(0.5s, std::bind(&PointTFBroadcastCppNode::on_timer, this));
    }

private:
    void on_timer()
    {
        geometry_msgs::msg::PointStamped ps;
        ps.header.stamp = this->now();
        ps.header.frame_id = "laser";
        x_ += 0.01;
        ps.point.x = x_;
        ps.point.y = 0.0;
        ps.point.z = -0.1;
        RCLCPP_INFO(this->get_logger(), "发布订阅");
        pub_->publish(ps);
    }
};
int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<PointTFBroadcastCppNode>());
    rclcpp::shutdown();
    return 0;
}
/*
ps.header.frame_id = "laser"​：

这行代码明确指定了点的坐标系是 "laser"

这意味着点坐标 (x, y, z) 是相对于 laser坐标系原点的位置

​点的坐标值​：

ps.point.x = x_：点在 laser坐标系的 X 轴位置

ps.point.y = 0.0：点在 laser坐标系的 Y 轴位置（在原点）

ps.point.z = -0.1：点在 laser坐标系的 Z 轴位置（低于原点）

关键概念
​相对性​：坐标系中的点坐标总是相对于某个参考坐标系

​frame_id 的作用​：它告诉接收者（如 RViz）这个点是在哪个坐标系中测量的

​与"世界坐标系"的关系​：

这个点不是直接相对于世界坐标系的

它只相对于 laser坐标系

要确定它相对于世界坐标系的位置，需要知道 laser坐标系相对于世界坐标系的变换关系

*/